// DAO/Impl/CategoryDaoImpl.java
package com.hp.DAO.Impl;                         // 实现包

import com.hp.DAO.BaseDao;                       // 基类
import com.hp.DAO.CategoryDao;                   // 接口：CategoryDao
import com.hp.Model.Category;                    // 实体：分类
import com.hp.Util.RowMapper;                    // 行映射器
import com.hp.Util.SimpleJdbcTemplate;           // JDBC 模板

import java.sql.Timestamp;                // 时间戳
import java.util.Date;                    // Date
import java.util.List;                    // List

/** CategoryDao 的 JDBC 实现 */
public class CategoryDaoImpl extends BaseDao implements CategoryDao {
    public CategoryDaoImpl(SimpleJdbcTemplate jdbc) { super(jdbc); } // 构造注入

    // RowMapper：ResultSet -> Category
    private static final RowMapper<Category> M = rs -> {
        Category c = new Category();                                // 新建实体
        c.setId(rs.getLong("id"));                                   // id
        c.setName(rs.getString("name"));                             // 名称
        c.setParentId((Long) rs.getObject("parent_id"));             // 父ID（可为 null）
        c.setLevel((Integer) rs.getObject("level"));                 // 层级（可为 null）
        c.setPath(rs.getString("path"));                             // 路径
        Timestamp ts = rs.getTimestamp("created_at");                // 创建时间
        c.setCreatedAt(ts == null ? null : new Date(ts.getTime()));  // 转 Date
        return c;                                                    // 返回
    };

    @Override
    public Category findById(Long id) {                              // 按主键查询
        String sql = "SELECT id,name,parent_id,level,path,created_at FROM category WHERE id=?"; // SQL
        return queryOne(sql, M, id);                                  // 执行
    }

    @Override
    public Category findByNameAndParent(String name, Long parentId) { // 按名称+父类查询
        String base = "SELECT id,name,parent_id,level,path,created_at FROM category WHERE name=? AND "; // 基础 SQL
        if (parentId == null) {                                      // 父为 null
            return queryOne(base + "parent_id IS NULL", M, name);     // 绑定1个参数
        } else {                                                      // 父有值
            return queryOne(base + "parent_id = ?", M, name, parentId); // 绑定2个参数
        }
    }

    @Override
    public List<Category> listChildren(Long parentId) {               // 列子分类
        String base = "SELECT id,name,parent_id,level,path,created_at FROM category WHERE "; // 基础 SQL
        if (parentId == null) {                                       // 顶级
            return queryList(base + "parent_id IS NULL ORDER BY name ASC", M); // 查询顶级
        } else {                                                       // 指定父
            return queryList(base + "parent_id = ? ORDER BY name ASC", M, parentId); // 查询子级
        }
    }

    @Override
    public Long insert(Category c) {                                  // 新增分类
        String sql = "INSERT INTO category (name,parent_id,level,path,created_at) VALUES (?,?,?,?,?)"; // SQL
        Date created = c.getCreatedAt() == null ? new Date() : c.getCreatedAt(); // 默认当前
        return execInsertReturnId(sql, c.getName(), c.getParentId(), c.getLevel(), c.getPath(),
                new Timestamp(created.getTime()));                    // 执行插入
    }

    @Override
    public int updateBasic(Category c) {                              // 更新基础字段
        String sql = "UPDATE category SET name=?, parent_id=?, level=?, path=? WHERE id=?"; // SQL
        return execUpdate(sql, c.getName(), c.getParentId(), c.getLevel(), c.getPath(), c.getId()); // 执行更新
    }

    @Override
    public int deleteById(Long id) {                                  // 删除
        String sql = "DELETE FROM category WHERE id=?";               // SQL
        return execUpdate(sql, id);                                   // 执行
    }
}

